home *** CD-ROM | disk | FTP | other *** search
- EMPTY
- : NEWSTART SP! LP! RP! 0 MODE PAGE CR
- ." RiscFORTH. Stand alone program." CR CR
- ." PI calculator will calculate 1000 decimal places in about 33 seconds." CR
- CR ." The speed depends on which mode you are in. MODE 0 appears to be the fastest." CR CR
- 'QUIT @EXECUTE ;
- ' NEWSTART ST-ADDR !
- 100000 CONSTANT base 5 CONSTANT dp
- 0 CONSTANT fa
- 0 CONSTANT A 0 CONSTANT B
- 0 CONSTANT X 0 CONSTANT Y
- VARIABLE places
- VARIABLE pointer 0 pointer !
- VARIABLE plusminus 0 plusminus !
-
- ( Define 4 arrays )
- : A% 4 * A + ; : B% 4 * B + ;
- : X% 4 * X + ; : Y% 4 * Y + ;
-
- ( Dimension space for 4 arrays )
- : DIM HERE TO A places @ 4 * ALLOT
- HERE TO B places @ 4 * ALLOT
- HERE TO X places @ 4 * ALLOT
- HERE TO Y places @ 4 * ALLOT ;
-
- ( Print ALL 5 digits from cell)
- : .CELL <# # # # # # #> TYPE SPACE ;
-
- ( .PI prints final value)
- : .PI CR 0 Y% @ . ." ." places @ 1- 1
- DO I DUP Y% @ .CELL 13 MOD 0=
- IF 2 SPACES THEN LOOP CR ;
-
- ( INITialise A%[] & B%[] arrays )
- : INIT places @ 0 DO
- 0 I A% ! 0 I B% ! LOOP 1 0 B% !
- 0 pointer ! 0 plusminus ! ;
-
- ( TAKE one cell from another )
- : TAKE + 2DUP < IF SWAP base +
- -: 1 ELSE - 0 THEN SWAP ;
-
- ( DIVide B%[] by number into B%[]. )
- : DIVB pointer @ DUP >R B% @
- OVER UM/MOD DUP R@ B% ! 0=
- IF 1 pointer +! THEN base *
- places @ R> 1+ 2DUP > IF DO I B% @
- + OVER UM/MOD I B% ! base * LOOP
- ELSE 2DROP THEN 2DROP ;
-
- ( DIVide B%[] by number into A%[] )
- : DIVA 0 places @ pointer @
- 1- DO I B% @ + OVER UM/MOD I A% !
- base * LOOP 2DROP ;
-
- ( Copy B%[] to A%[] )
- : B->A places @ 0
- DO I B% @ I A% ! LOOP ;
-
- ( Add A%[] to X%[] )
- : ADDAX 0 0 places @ 1- DO I A% @
- I X% @ + + base UM/MOD
- SWAP I X% ! -1 +LOOP DROP ;
-
- ( Add X%[] to Y%[]. )
- : ADDXY 0 0 places @ 1- DO I X% @
- I Y% @ + + base UM/MOD
- SWAP I Y% ! -1 +LOOP DROP ;
-
- ( Take A%[] from X%[]. )
- : TAKEAX 0 0 places @ 1-
- DO I X% @ I A% @ ROT TAKE
- I X% ! -1 +LOOP DROP ;
-
- ( Times X%[] by number. )
- : TIMES 0 0 places @ 1- DO I X% @
- 2 PICK UM* + base UM/MOD
- SWAP I X% ! -1 +LOOP 2DROP ;
-
- ( Accumulate ARCTAN series in X%[] )
- : ACCUM 1 plusminus @ - DUP
- plusminus ! IF ADDAX
- ELSE TAKEAX THEN ;
-
- ( Calculate Arctan )
- : ARCTAN DUP DUP INIT DIVB B->A
- ACCUM 147 < IF DUP * 2 TO fa
- ELSE 1 TO fa THEN
- 1 BEGIN OVER DIVB fa + DUP 2 MOD
- IF DUP DIVA ACCUM
- THEN pointer @ places @ 1- >
- UNTIL 2DROP ;
-
- ( Add all arctan series into Y%[])
- : PI 0 !TIME EMPTY 1- dp / 3 +
- places ! DIM places @ 0
- DO 0 I X% ! 0 I Y% ! LOOP
- 8 ARCTAN 24 TIMES ADDXY
- places @ 0 DO 0 I X% ! LOOP
- 57 ARCTAN 8 TIMES ADDXY
- places @ 0 DO 0 I X% ! LOOP
- 239 ARCTAN 4 TIMES ADDXY
- .PI CR ." Time:= " @TIME
- .TIME ." seconds" ;
-
- : NEWQUIT BEGIN RP! CR ." Number of decimal places ?"
- QUERY 32 WORD NUMBER CR PI CR AGAIN ;
- PROTECT
- HERE H.
-